package com.xxx.simple;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

/**
 * Rabbit MQ使用场景一：简单模式——1个生产者，1个消费者
 *  consumer(消费者)端步骤：
     (1)：创建ConnectionFactory，并且设置一些参数，比如hostname,portNumber等等
     (2)：利用ConnectionFactory创建一个Connection连接
     (3)：利用Connection创建一个Channel通道
     (4)：将queue和Channel进行绑定，注意这里的queue名字要和前面producer创建的queue一致
     (5)：创建消费者Consumer来接收消息，同时将消费者和queue进行绑定
 * 
 * @author guweiqiang
 * 2018年6月13日
 */
public class Consumer {
	
	// 队列名称
	private static final String QUEUE_NAME = "rabbitMQ.test";
	
	// rabbit MQ server host
//	private static final String HOST = "localhost";

	public static void main(String[] args) throws IOException, TimeoutException {
		// 1.创建连接工厂，并设置工厂相关属性
		ConnectionFactory factory = new ConnectionFactory();
//		factory.setHost(HOST); // MQ server 不设置默认为localhost
		
		// 2.创建一个连接
		Connection connection = factory.newConnection();
		
		// 3.创建一个通道
		Channel channel = connection.createChannel();
		
		// 4.声明一个队列
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		// 第一个参数表示队列名称
		// 第二个参数为是否需要持久化（true表示是，队列将在服务器重启时生成）
		// 第三个参数为是否是独占队列（创建者可以使用的私有队列，断开后自动删除）
		// 第四个参数为当所有消费者客户端连接断开时是否自动删除队列
		// 第五个参数为队列的其他参数
		
		// 5.从队列里接收消息
		System.out.println("Consumer Waiting Received messages：");
		// 告诉服务器我们需要哪个channel里的消息，如果该channel里有消息，就会执行回调函数
		// DefaultConsumer表示consumer采取的是pull模式来消费消息
		com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope,
                    AMQP.BasicProperties properties, byte[] body) throws IOException {
				String message = new String(body, "UTF-8");
				System.out.println("Consumer received message：" + message);
			}
		};
		
		// 6.回复确认
		channel.basicConsume(QUEUE_NAME, true, consumer);
		// 第一个参数表示队列名称
		// 第二个参数为是否自动回复（true表示是）
		// 第三个参数为消费者
		
		// 7.关闭连接
//		channel.close();
//		connection.close();
	}

}
